package cn.wolfcode.wms.service.impl;

import cn.wolfcode.wms.domain.OrderBill;
import cn.wolfcode.wms.domain.OrderBillItem;
import cn.wolfcode.wms.mapper.OrderBillItemMapper;
import cn.wolfcode.wms.mapper.OrderBillMapper;
import cn.wolfcode.wms.query.QueryObject;
import cn.wolfcode.wms.service.IOrderBillService;
import cn.wolfcode.wms.util.PageResult;
import cn.wolfcode.wms.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;

@Service
public class OrderBillServiceImpl implements IOrderBillService{

    @Autowired
    private OrderBillMapper billMapper;
    @Autowired
    private OrderBillItemMapper itemMapper;

    public void saveOrUpdate(OrderBill entity) {

        //判断是保存还是添加操作
        if (entity.getId() == null) {
           insert(entity);
        }else{
            update(entity);
        }

    }

    //保存的方法
    private void insert(OrderBill entity) {
        //首先第一步是要保存录入人
        entity.setInputUser(UserContext.getCurrentUser());
        //然后是设置录入时间
        entity.setInputTime(new Date());
        //设置单据状态(默认状态是没有审核的)
        entity.setStatus(OrderBill.NORMAL);
        //设置明细的数据(这里需要定义两个变量,用来计算出总数量和总金额)
        BigDecimal totalNumber = BigDecimal.ZERO;
        BigDecimal totalAmount = BigDecimal.ZERO;
        //计算单据的小计(需要循环迭代出所有的单据)
        for (OrderBillItem item : entity.getItems()) {
            BigDecimal number = item.getNumber();//明细的数量
            BigDecimal costPrice = item.getCostPrice();//商品的零售价
            //计算出一条明细的小计(第二个参数表示要四舍五入模式)
            BigDecimal amount = number.multiply(costPrice).setScale(2, RoundingMode.HALF_UP);
            //把计算好的小计保存到对象中去
            item.setAmount(amount);
            //需要叠加总金额和总数量
            totalAmount = totalAmount.add(costPrice);
            totalNumber = totalNumber.add(number);
        }
        //把总金额保存到对象中去,
        entity.setTotalNumber(totalNumber);
        entity.setTotalAmount(totalAmount);

        //先保存单据在保存明细,因为明细中需要单据的外键
        billMapper.insert(entity);
        //因为是一张单据对应着对个明细,所有这里需要用到循环的方式来保存明细
        for (OrderBillItem item : entity.getItems()) {
            //这里是添加外键关系
            item.setBillId(entity.getId());
            itemMapper.insert(item);
        }
    }

    //更新的方法
    private void update(OrderBill entity) {
        //首先要判断是否是已经审核的,如果没有审核,才可以更新
        OrderBill old = billMapper.selectByPrimaryKey(entity.getId());
        //只有没有审核的才可以更改
        if (old.getStatus() == OrderBill.NORMAL) {
            //先删除旧单据对应的所有明细
            billMapper.deleteByrelation(old.getId());
            //需要定义两个变量用来
            BigDecimal totalNumber = BigDecimal.ZERO;
            BigDecimal totalAmount = BigDecimal.ZERO;
            for (OrderBillItem item : entity.getItems()) {
                //计算小计
                BigDecimal number = item.getNumber();
                BigDecimal costPrice = item.getCostPrice();
                //四舍五入模式
                BigDecimal amount = number.multiply(costPrice).setScale(2, RoundingMode.HALF_UP);
                item.setAmount(amount);
                //计算总数量和总价格
                totalAmount = totalAmount.add(amount);
                totalNumber = totalNumber.add(number);
                //更新操作中可以先更新明细
                item.setBillId(entity.getId());
                itemMapper.insert(item);
            }
            //把总数量和总价格保存到对象中去
            entity.setTotalAmount(totalAmount);
            entity.setTotalNumber(totalNumber);

            //最后是要更新单据
            billMapper.updateByPrimaryKey(entity);
        }
    }

    public void delete(Long id) {

        //判断是否审核了,如果审核了,那么就不能删除
        OrderBill orderBill = billMapper.selectByPrimaryKey(id);
        if (orderBill.getStatus() == OrderBill.NORMAL) {
            //先删除明细,在删除单据
            billMapper.deleteByrelation(id);
            //删除单据
            billMapper.deleteByPrimaryKey(id);
        }

    }

    public OrderBill get(Long id) {

        return billMapper.selectByPrimaryKey(id);
    }

    public PageResult queryResult(QueryObject qo) {
        Integer rows = billMapper.queryForCount(qo);
        //判断数据库中的记录数是否为null
        if (rows==0) {
            return PageResult.EMPRY_PAGE;
        }
        //===============
        //如果数据库中有数据
        List<OrderBill> data = billMapper.queryForPage(qo);
        return new PageResult(data,rows,qo.getCurrentPage(),qo.getPageSize());
    }

    public void audit(Long orditId) {

        //审核需要设置审核人,审核时间,改变状态
        OrderBill orderBill = billMapper.selectByPrimaryKey(orditId);
        //判断是否已经审核了,如果没有审核才进来审核
        if (orderBill.getStatus() == OrderBill.NORMAL) {

            //设置审核人(设置当前用户就是审核人)
            orderBill.setAuditor(UserContext.getCurrentUser());
            //设置审核时间
            orderBill.setAuditTime(new Date());
            //改变审核后的状态
            orderBill.setStatus(OrderBill.AUDIT);
            //最后是发送SQL
            billMapper.updateByAudit(orderBill);
        }
    }
}
